在Visaul C++6.0中编译、调试引擎应用程序

与其他语言编程一样,用户编写的引擎应用程序很难保证一次成功,往往需要进行大量的调试工作。MATLAB提供了不同操作系统下引擎应用程序的调试方法。签于Visual C++ 功能强大的编译和调试功能,用其对C语言程序的兼容性,本节在“eng1.c”文件基础上,加入部分引擎库函数得到“eng2.c”,并以eng2.c为例说明Visaul C++6.0中编译、调试引擎应用程序步骤。

eng2.c是通过引擎库函数engGetVariable()从引擎启动的MATLAB空间中将数据输入C程序,并在C程序中将引擎计算结果输出到文本文件“ng2Out.txt”中。整个引擎应用程序创建过程为:

(1)启动Microsoft Visual Studio后,执行File->New,在弹出的对话框中选择“Win32 Console Application”作为即将创建的应用程序类型,并在ProjectName文本框中输入应用程序工程名,也就是以后生成的可执行程序名,如“Eng2”,点击OK确定(图1-10)。在接下来的对话框中选An empty project(图3-5),并以Finish完成引擎应用程序工程创建;

Document Image

图3-4 引擎应用程序工程创建Win32 Console Application 对话框设置)

Document Image

图3-5 引擎应用程序工程创建(Project 对话框设置)

(2)在所创建的引擎应用程序工程中,打开已有C程序或新建C程序(见Eng2.c程序清单);

(3)引擎应用程序编译器路径设置:在Microsoft Visual Studio的Tools->Options对话框中,点击Directories项,在该对话框Show directories for 中选取Include files并在Directories 中添加“C:\MATLAB7\EXTERN\INCLUDE”(图3-6),在Show directories for 中选取Library files并在Directories 中添加“C:\MATLAB7\EXTERN\LIB\WIN32\MICROSOFT\MSVC60”(图3-7),点击OK完成编译路径设置;

(4) 引擎应用程序链接路径设置:在Microsoft Visual Studio的Project->Settings对话框中,点击Link项,在该对话框Object/library modules 中添加libmx.lib libeng.lib完成链接路径设置(图3-8)。

至此,已完成了引擎应用程序编译、链接等设置工作,可以对所创建的引擎应用程序进行编译、调试并执行引擎应用程序。

Document Image

图3-6 引擎应用程序的编译路径设置(Include files)

Document Image

图3-7 引擎应用程序的编译路径设置(Library files)

Document Image

图3-8 引擎应用程序链接路径设置

code.c
//////  eng2.c程序清单/////////////////////////////////////////////////
/////////////头文件
#include "engine.h"
#include "stdio.h"
#include "conio.h"
//////////////////////C程序
int main()
{
double *cx,*cy,*cy1;
int n,i;
FILE *fp;
//////////////打开引擎
Engine *ep;
if((ep=engOpen(NULL))==NULL){printf("\nCan't Open MATLAB engine\n");exit(0);}
/////////////通过引擎库函数调用MATLAB命令
engEvalString(ep,"x=0:0.1:2*pi;");
engEvalString(ep,"y=sin(x);");
engEvalString(ep,"y1=cos(x);");
engEvalString(ep,"plot(x,y,x,y1);");
engEvalString(ep,"xlabel('X');");
engEvalString(ep,"ylabel('Y');");
///////////// 通过引擎库函数将后台MATLAB空间中的数据传入C程序
n=mxGetN(engGetVariable(ep,"x"));
cx=mxGetPr(engGetVariable(ep,"x"));
cy=mxGetPr(engGetVariable(ep,"y"));
cy1=mxGetPr(engGetVariable(ep,"y1"));
printf("\n Press anykey to continue\n"); getch();
///////////关闭引擎
if(engClose(ep)!=0){printf("\nCan't close MATLAB engine normally\n");exit(-1);}
printf("\n MATLAB engine is over\n");
//////////将MATLAB引擎计算结果输出
if((fp=fopen("eng2Out.txt","w"))==NULL){printf(" Can't open OutPutfile\n");exit(0);}
for(i=0;i<n;i++)fprintf(fp," %3d %12.4lf   %12.4lf %12.4lf \n",i,cx[i],cy[i],cy1[i]);
//////////释放内存
mxFree(cx); mxFree(cy);
fclose(fp);
return 0;}
/////////////////结束